using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using FiltronASP.Logger;

namespace FiltronASP.Models.DAO
{
    /// <summary>
    /// Klasa dla operacji bazodanowych specyficznych dla tabeli <code>templates</code>.
    /// </summary>
    public class TemplateDAO : Abstracts.AbstractGenericDAO<Template, System.Nullable<int>>,
        Interfaces.ITemplateDAO
    {
        /// <summary>
        /// Metoda zwracajaca nazwe parametru bedacego kluczem glownym tabeli.
        /// </summary>
        /// <returns>nazwa klucza glownego</returns>
        protected override string GetKeyProperty()
        {
            return "template_id";
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie języka.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <returns>Lista rekordów o zadanym języku lub null, gdy nie ma</returns>
        public IQueryable<Template> FindByLang(int languageId)
        {
            if (languageId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                IQueryable<Template> templates = this._cmsEntitiesDataContext.Templates.Where(
                    temp => temp.language_id.Equals(languageId)
                        );

                if (!(templates.Any()))
                {
                    return null;
                }   //if
                return templates;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Wstawianie listy obiektów na podstawie jezyka.
        /// </summary>
        /// <param name="defaultLanguageId">domyslny jezyk</param>
        /// <param name="newLanguageId">nowy jezyk</param>
        /// <returns>true jesli sie udalo, false wpp</returns>
        public bool InsertForNewLanguage(int defaultLanguageId, int newLanguageId)
        {
            if (defaultLanguageId.Equals(0) || newLanguageId.Equals(0))
            {
                return false;
            }   //if
            try
            {
                IQueryable<Template> templates = this.FindByLang(defaultLanguageId);
                if (templates == null)
                {
                    return true;
                }   //if
                if (!(templates.Any()))
                {
                    return true;
                }   //if
                foreach (Template temp in templates)
                {
                    Template templateToInsert = new Template();
                    templateToInsert.language_id = newLanguageId;
                    templateToInsert.template_active = temp.template_active;
                    templateToInsert.template_created = temp.template_created;
                    templateToInsert.template_description = temp.template_description;
                    templateToInsert.template_hidden = temp.template_hidden;
                    templateToInsert.template_modified = temp.template_modified;
                    templateToInsert.template_name = temp.template_name;
                    templateToInsert.template_path = temp.template_path;
                    this.Add(templateToInsert);
                }

            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return true;
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie języka i typu strony.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <param name="pageTypeId">typ strony</param>
        /// <returns>lista rekordow o zadanym języku i typie strony</returns>
        public IQueryable<Template> FindByLangAndPageType(int languageId, int pageTypeId)
        {
            if (languageId.Equals(0) || pageTypeId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                IQueryable<Template> templates = this._cmsEntitiesDataContext.Templates.Where(
                    temp => temp.language_id.Equals(languageId) &&
                        this._cmsEntitiesDataContext.PageTypeAcceptableTemplates.Where(page =>
                            page.page_type_id.Equals(pageTypeId)).Select(pa => pa.template_id).Contains(temp.template_id)
                        );

                if (!(templates.Any()))
                {
                    return null;
                }   //if
                return templates;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie języka i ścieżki dostępu.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <param name="templatePath">ścieżka</param>
        /// <returns>Lista rekordów o zadanym języku i ścieżce</returns>
        public IQueryable<Template> FindByLangAndPageType(int languageId, String templatePath)
        {
            if (languageId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                IQueryable<Template> templates = this._cmsEntitiesDataContext.Templates.Where(
                    temp => temp.language_id.Equals(languageId) && temp.template_path.Equals(templatePath)
                        );

                if (!(templates.Any()))
                {
                    return null;
                }   //if
                return templates;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie obiektu na podstawie języka i ścieżki dostępu.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <param name="templateName">nazwa</param>
        /// <returns>Rekord o zadanym języku i nazwie temp</returns>
        public Template FindByLangAndName(int languageId, string templateName)
        {
            if (languageId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                Template template = this._cmsEntitiesDataContext.Templates.First(
                    temp => temp.language_id.Equals(languageId) && temp.template_name.Equals(templateName)
                        );
                return template;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Usuwanie obiektow po jezyku.
        /// </summary>
        /// <param name="languageId">jezyk</param>
        /// <returns>true dla sukcesu, false w przeciwnym razie</returns>
        public bool DeleteByLanguage(int languageId)
        {
            if (languageId.Equals(0))
            {
                return false;
            }   //if
            try
            {
                IQueryable<Template> templates = this.FindByLang(languageId);
                if (templates == null)
                {
                    return true;
                }   //if
                if (!(templates.Any()))
                {
                    return true;
                }   //if
                foreach (Template temp in templates)
                {
                    this._cmsEntitiesDataContext.Templates.DeleteOnSubmit(temp);
                }
                try
                {
                    _cmsEntitiesDataContext.SubmitChanges();

                }
                catch (Exception ex)
                {
                    MyLogger.Log(ex);
                }   //catch
                return true;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return false;
        }
    }
}
